home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Plus 2002 #11
/
Amiga Plus CD - 2002 - No. 11.iso
/
Tools
/
Development
/
reportplus
/
source
/
f8.c
< prev
next >
Wrap
C/C++ Source or Header
|
2002-10-27
|
59KB
|
1,665 lines
#include <exec/types.h>
#include <exec/memory.h>
#include <proto/exec.h>
#include <intuition/intuition.h>
#include <intuition/gadgetclass.h>
#include <proto/intuition.h>
#include <libraries/gadtools.h>
#include <proto/gadtools.h>
#include <dos/dos.h>
#include <dos/exall.h>
#include <dos/dostags.h>
#include <proto/dos.h>
#include <graphics/gfx.h>
#include <clib/graphics_protos.h>
#include <clib/alib_protos.h>
#include <libraries/asl.h>
#include <clib/asl_protos.h>
#include <ctype.h>
#include <stdlib.h>
#include <string.h>
#include "rp.h"
#define ALL_REACTION_CLASSES
#include <reaction/reaction.h>
#define TRUNCATE 39
#define GRANULARITY_DIRS 10
#define GRANULARITY_FILES 10
MODULE void parent(void);
MODULE void root(void);
MODULE void pathasl(void);
MODULE void writeline(void);
MODULE void killsizelist(void);
MODULE void ghost(void);
MODULE void unghost(void);
MODULE void scale(ULONG bytes);
// MODULE void __inline progressbar(ULONG level);
MODULE void examine(STRPTR thename, ULONG nesting, ULONG parentdir);
MODULE void AddSpecialNode(struct List* ListPtr, STRPTR pathname, ULONG nesting, ULONG size, ULONG parentdir, ULONG key, LONG type, LONG prot);
MODULE void FreeSpecialNodes(struct List* ListPtr);
MODULE void print_node(ULONG passedkey);
MODULE void print_entry(struct SpecialNode* NodePtr);
MODULE void print_list(ABOOL close);
MODULE void busy(void);
#define UNITOPTIONS 3 // counting from 0
MODULE STRPTR UnitOptions[UNITOPTIONS + 1] =
{ "Bytes",
"Kilobytes",
"Megabytes",
"Blocks"
};
MODULE struct SpecialNode
{ struct Node Node;
ULONG nesting,
size,
parentdir,
key;
LONG type,
prot;
TEXT pathname[1];
};
MODULE struct ColumnInfo SizeColumnInfo[] =
{ { 75, // WORD ci_Width
"Pathname", // STRPTR ci_Title
0, // ULONG ci_Flags
},
{ 25,
"Size",
0, /* Last column must not have CIF_DRAGGABLE set (CIF_DRAGGABLE applies
to the right border of the relevant column). */
},
{ -1, (STRPTR) ~0, -1
} };
IMPORT struct TextAttr Topaz8;
IMPORT SBYTE page;
IMPORT TEXT weekdaystring[LEN_DATSTRING],
datestring[LEN_DATSTRING],
timestring[LEN_DATSTRING],
asldir[PATHNAMEFIELD + 1],
aslresult[PATHNAMEFIELD + 1],
IOBuffer[LONGESTFIELD + 1];
IMPORT struct SharedStruct shared;
IMPORT struct Screen* ScreenPtr;
IMPORT struct Window* MainWindowPtr;
IMPORT struct ExAllData* EADataPtr;
IMPORT struct Menu* MenuPtr;
IMPORT Object* WinObject[FUNCTIONS + 1];
IMPORT ULONG increment;
AGLOBAL struct Gadget* size_gadgets[GIDS_8 + 1];
AGLOBAL struct SizeStruct size =
{ 0, 0, 0, 0, 0, 0, 0,
(ULONG) FALSE, (ULONG) FALSE, (ULONG) FALSE,
"RAM:", "RAM:", "RAM:ReportPlus.log"
};
MODULE struct List SizeList,
EmptySizeList,
List1,
List2;
MODULE BPTR DirHandle = NULL,
LogFileHandle = NULL;
MODULE TEXT logstring[PATHNAMEFIELD + 1];
MODULE UBYTE commastring[13 + 1];
MODULE ULONG status = STATUS_READY,
key = 0,
topnesting = 0,
showall = TRUE,
showfiles = TRUE;
AGLOBAL void size_init(void)
{ struct ListBrowserNode* ListBrowserNodePtr;
NewList(&List1);
NewList(&List2);
NewList(&SizeList);
/* Create a 2-column listbrowser list with only one node containing
only column tags. */
NewList(&EmptySizeList);
if (!(ListBrowserNodePtr = AllocListBrowserNode
( 2, // columns
/* LBNCA_ tags are those that apply to the specific column. */
LBNA_Column, 0,
LBNA_Column, 1,
TAG_END
)))
{ rq("Can't create ReAction listbrowser.gadget node(s)!");
}
AddTail(&EmptySizeList, (struct Node *) ListBrowserNodePtr); // AddTail() has no return code
}
AGLOBAL void size1(void)
{ struct Hook Hook8Struct;
struct List ChooserList;
struct ChooserNode* ChooserNodePtr[UNITOPTIONS + 1];
ULONG i;
NewList(&ChooserList);
for (i = 0; i <= UNITOPTIONS; i++)
{ if (!(ChooserNodePtr[i] = (struct ChooserNode *) AllocChooserNode(CNA_Text, UnitOptions[i], TAG_DONE)))
{ rq("Can't allocate chooser node!");
}
AddTail(&ChooserList, (struct Node *) ChooserNodePtr[i]);
} // automatically freed by ReAction at DisposeObject() time
InitHook(&Hook8Struct, Hook8Func, NULL);
/* Create the window object. */
lockscreen();
/* We can't just use EmptyList for an empty columnar list, we
actually need a node (with the LBNA_Column tags) to be present.
LISTBROWSER_ScrollRaster seems not to be usable with
multi-column lists. */
if (!(WinObject[8] = NewObject(WINDOW_GetClass(), NULL,
// window
WA_PubScreen, ScreenPtr,
WA_ScreenTitle, "Report+",
WA_Title, "Report+: Path Size Report",
WA_Activate, TRUE,
WA_DepthGadget, TRUE,
WA_DragBar, TRUE,
WA_CloseGadget, TRUE,
WA_SizeGadget, TRUE,
WA_IDCMP, IDCMP_RAWKEY,
WINDOW_IDCMPHook, &Hook8Struct,
WINDOW_IDCMPHookBits, IDCMP_RAWKEY,
WINDOW_MenuStrip, MenuPtr,
WINDOW_Position, WPOS_CENTERSCREEN,
WINDOW_ParentGroup, size_gadgets[GID_8_LY1] =
NewObject
( LAYOUT_GetClass(), NULL,
// root-layout
LAYOUT_Orientation, LAYOUT_ORIENT_VERT,
LAYOUT_SpaceOuter, TRUE,
LAYOUT_DeferLayout, TRUE,
LAYOUT_AddChild,
NewObject
( LAYOUT_GetClass(), NULL,
LAYOUT_Orientation, LAYOUT_ORIENT_HORIZ,
LAYOUT_VertAlignment, LALIGN_CENTER,
LAYOUT_HorizAlignment, LALIGN_CENTER,
LAYOUT_BevelStyle, BVS_NONE,
LAYOUT_AddImage,
NewObject
( LABEL_GetClass(), NULL,
LABEL_Text, "_Path:",
LABEL_Justification,LJ_LEFT,
TAG_END),
CHILD_WeightedWidth, 0,
LAYOUT_AddChild, size_gadgets[GID_8_ST1] =
NewObject
( STRING_GetClass(), NULL,
GA_ID, GID_8_ST1,
GA_RelVerify, TRUE,
GA_TabCycle, TRUE,
STRINGA_TextVal, size.path,
STRINGA_MinVisible,20,
TAG_END),
LAYOUT_AddChild, size_gadgets[GID_8_BU1] =
NewObject(NULL, "button.gadget",
GA_ID, GID_8_BU1,
GA_RelVerify, TRUE,
BUTTON_AutoButton, BAG_POPFILE,
TAG_END),
CHILD_WeightedWidth, 0,
TAG_END),
CHILD_WeightedHeight, 0,
LAYOUT_AddChild, NewObject(LAYOUT_GetClass(), NULL,
LAYOUT_Orientation, LAYOUT_ORIENT_HORIZ,
LAYOUT_VertAlignment, LALIGN_CENTER,
LAYOUT_HorizAlignment, LALIGN_CENTER,
LAYOUT_BevelStyle, BVS_NONE,
LAYOUT_ShrinkWrap, TRUE,
LAYOUT_AddChild, size_gadgets[GID_8_CB1] =
NewObject
( CHECKBOX_GetClass(),NULL,
// checkbox
GA_ID, GID_8_CB1,
GA_RelVerify, TRUE,
GA_Text, "_Log to:",
GA_Selected, (BOOL) size.log,
TAG_END
),
CHILD_WeightedWidth, 0,
LAYOUT_AddChild, size_gadgets[GID_8_ST2] =
NewObject(STRING_GetClass(), NULL,
// string
GA_ID, GID_8_ST2,
GA_RelVerify, TRUE,
GA_TabCycle, TRUE,
STRINGA_TextVal, size.logfile,
STRINGA_MinVisible,20,
GA_Disabled, !size.log,
TAG_END
),
LAYOUT_AddChild, size_gadgets[GID_8_BU3] =
NewObject
( NULL, "button.gadget",
// button
GA_ID, GID_8_BU3,
GA_RelVerify, TRUE,
BUTTON_AutoButton, BAG_POPFILE,
GA_Disabled, !size.log,
TAG_END
),
CHILD_WeightedWidth, 0,
TAG_END
),
CHILD_WeightedHeight, 0,
LAYOUT_AddChild,
NewObject
( LAYOUT_GetClass(), NULL,
LAYOUT_Orientation, LAYOUT_ORIENT_VERT,
LAYOUT_SpaceOuter, TRUE,
LAYOUT_VertAlignment, LALIGN_CENTER,
LAYOUT_HorizAlignment, LALIGN_CENTER,
LAYOUT_BevelStyle, BVS_FIELD,
LAYOUT_AddChild,
NewObject
( LAYOUT_GetClass(), NULL,
LAYOUT_Orientation, LAYOUT_ORIENT_HORIZ,
LAYOUT_VertAlignment, LALIGN_CENTER,
LAYOUT_HorizAlignment, LALIGN_CENTER,
LAYOUT_BevelStyle, BVS_NONE,
LAYOUT_AddChild, size_gadgets[GID_8_BU6] =
NewObject
( NULL, "button.gadget",
GA_ID, GID_8_BU6,
GA_RelVerify, TRUE,
GA_Text, "_Root",
TAG_END
),
CHILD_WeightedWidth, 50,
LAYOUT_AddChild, size_gadgets[GID_8_BU7] =
NewObject
( NULL, "button.gadget",
GA_ID, GID_8_BU7,
GA_RelVerify, TRUE,
GA_Text, "P_arent",
TAG_END
),
CHILD_WeightedWidth, 50,
TAG_END),
CHILD_WeightedHeight, 0,
LAYOUT_AddChild, size_gadgets[GID_8_LB2] =
NewObject
( LISTBROWSER_GetClass(),NULL,
GA_ID, GID_8_LB2,
GA_RelVerify, TRUE,
GA_TextAttr, &Topaz8,
LISTBROWSER_Labels, (ULONG) &EmptySizeList,
LISTBROWSER_ColumnInfo,(ULONG) &SizeColumnInfo,
LISTBROWSER_ColumnTitles,TRUE,
LISTBROWSER_MinVisible,6,
TAG_END),
CHILD_WeightedHeight, 100,
CHILD_MinHeight, 160,
LAYOUT_AddChild,
NewObject
( LAYOUT_GetClass(), NULL,
LAYOUT_Orientation, LAYOUT_ORIENT_HORIZ,
LAYOUT_VertAlignment, LALIGN_LEFT,
LAYOUT_HorizAlignment, LALIGN_RIGHT,
LAYOUT_BevelStyle, BVS_NONE,
LAYOUT_AddChild,
NewObject
( LAYOUT_GetClass(), NULL,
LAYOUT_Orientation, LAYOUT_ORIENT_VERT,
LAYOUT_VertAlignment, LALIGN_CENTER,
LAYOUT_HorizAlignment, LALIGN_RIGHT,
LAYOUT_BevelStyle, BVS_NONE,
LAYOUT_AddImage,
NewObject
( LABEL_GetClass(), NULL,
LABEL_Text, "Files:",
LABEL_Justification,LJ_CENTRE,
TAG_END),
CHILD_WeightedHeight, 0,
LAYOUT_AddImage,
NewObject
( LABEL_GetClass(), NULL,
LABEL_Text, "Directories:",
LABEL_Justification,LJ_CENTRE,
TAG_END),
CHILD_WeightedHeight, 0,
LAYOUT_AddImage,
NewObject
( LABEL_GetClass(), NULL,
LABEL_Text, "Block size:",
LABEL_Justification,LJ_CENTRE,
TAG_END),
CHILD_WeightedHeight, 0,
TAG_END),
CHILD_WeightedWidth, 0,
LAYOUT_AddChild,
NewObject
( LAYOUT_GetClass(), NULL,
LAYOUT_Orientation, LAYOUT_ORIENT_VERT,
LAYOUT_VertAlignment, LALIGN_CENTER,
LAYOUT_HorizAlignment, LALIGN_RIGHT,
LAYOUT_BevelStyle, BVS_NONE,
LAYOUT_AddChild, size_gadgets[GID_8_ST6] =
NewObject
( STRING_GetClass(), NULL,
GA_ID, GID_8_ST6,
GA_ReadOnly, TRUE,
STRINGA_TextVal, "-",
STRINGA_MinVisible,13,
STRINGA_Justification,GACT_STRINGRIGHT,
GA_TextAttr, &Topaz8,
TAG_END),
CHILD_WeightedHeight, 0,
LAYOUT_AddChild, size_gadgets[GID_8_ST7] =
NewObject
( STRING_GetClass(), NULL,
GA_ID, GID_8_ST7,
GA_ReadOnly, TRUE,
STRINGA_TextVal, "-",
STRINGA_MinVisible,13,
STRINGA_Justification,GACT_STRINGRIGHT,
GA_TextAttr, &Topaz8,
TAG_END),
CHILD_WeightedHeight, 0,
LAYOUT_AddChild, size_gadgets[GID_8_ST8] =
NewObject
( STRING_GetClass(), NULL,
GA_ID, GID_8_ST8,
GA_ReadOnly, TRUE,
STRINGA_TextVal, "-",
STRINGA_MinVisible,13,
STRINGA_Justification,GACT_STRINGRIGHT,
GA_TextAttr, &Topaz8,
TAG_END),
CHILD_WeightedHeight, 0,
TAG_END),
CHILD_WeightedWidth, 0,
LAYOUT_AddImage, NewObject
( LABEL_GetClass(), NULL,
LABEL_Text, "",
TAG_END
),
CHILD_WeightedWidth, 100,
LAYOUT_AddChild,
NewObject
( LAYOUT_GetClass(), NULL,
LAYOUT_Orientation, LAYOUT_ORIENT_VERT,
LAYOUT_VertAlignment, LALIGN_CENTER,
LAYOUT_HorizAlignment, LALIGN_RIGHT,
LAYOUT_BevelStyle, BVS_NONE,
LAYOUT_AddImage,
NewObject
( LABEL_GetClass(), NULL,
LABEL_Text, "Used in path:",
LABEL_Justification,LJ_RIGHT,
TAG_END),
CHILD_WeightedHeight, 0,
LAYOUT_AddImage,
NewObject
( LABEL_GetClass(), NULL,
LABEL_Text, "Free on volume:",
LABEL_Justification,LJ_RIGHT,
TAG_END),
CHILD_WeightedHeight, 0,
LAYOUT_AddImage,
NewObject
( LABEL_GetClass(), NULL,
LABEL_Text, "Volume capacity:",
LABEL_Justification,LJ_RIGHT,
TAG_END),
CHILD_WeightedHeight, 0,
TAG_END),
CHILD_WeightedWidth, 0,
LAYOUT_AddChild,
NewObject
( LAYOUT_GetClass(), NULL,
LAYOUT_Orientation, LAYOUT_ORIENT_VERT,
LAYOUT_VertAlignment, LALIGN_CENTER,
LAYOUT_HorizAlignment, LALIGN_RIGHT,
LAYOUT_BevelStyle, BVS_NONE,
LAYOUT_AddChild, size_gadgets[GID_8_ST4] =
NewObject
( STRING_GetClass(), NULL,
GA_ID, GID_8_ST4,
GA_ReadOnly, TRUE,
STRINGA_TextVal, "-",
STRINGA_MinVisible,13,
STRINGA_Justification,GACT_STRINGRIGHT,
GA_TextAttr, &Topaz8,
TAG_END),
CHILD_WeightedHeight, 0,
LAYOUT_AddChild, size_gadgets[GID_8_ST5] =
NewObject
( STRING_GetClass(), NULL,
GA_ID, GID_8_ST5,
GA_ReadOnly, TRUE,
STRINGA_TextVal, "-",
STRINGA_MinVisible,13,
STRINGA_Justification,GACT_STRINGRIGHT,
GA_TextAttr, &Topaz8,
TAG_END),
CHILD_WeightedHeight, 0,
LAYOUT_AddChild, size_gadgets[GID_8_ST3] =
NewObject
( STRING_GetClass(), NULL,
GA_ID, GID_8_ST3,
GA_ReadOnly, TRUE,
STRINGA_TextVal, "-",
STRINGA_MinVisible,13,
STRINGA_Justification,GACT_STRINGRIGHT,
GA_TextAttr, &Topaz8,
TAG_END),
CHILD_WeightedHeight, 0,
TAG_END),
CHILD_WeightedWidth, 0,
TAG_END),
CHILD_WeightedHeight, 0,
TAG_END),
CHILD_WeightedHeight, 70,
LAYOUT_AddChild,
NewObject
( LAYOUT_GetClass(), NULL,
LAYOUT_Orientation, LAYOUT_ORIENT_HORIZ,
LAYOUT_VertAlignment, LALIGN_CENTER,
LAYOUT_HorizAlignment, LALIGN_CENTER,
LAYOUT_BevelStyle, BVS_NONE,
LAYOUT_AddChild, size_gadgets[GID_8_CB4] =
NewObject
( CHECKBOX_GetClass(),NULL,
// checkbox
GA_ID, GID_8_CB4,
GA_RelVerify, TRUE,
GA_Text, "Show s_ubdirectories?",
GA_Selected, (BOOL) showall,
TAG_END),
CHILD_WeightedWidth, 0,
LAYOUT_AddChild, size_gadgets[GID_8_CB5] =
NewObject
( CHECKBOX_GetClass(),NULL,
// checkbox
GA_ID, GID_8_CB5,
GA_RelVerify, TRUE,
GA_Text, "Show _files?",
GA_Selected, (BOOL) showfiles,
TAG_END),
CHILD_WeightedWidth, 0,
LAYOUT_AddImage, NewObject
( LABEL_GetClass(), NULL,
LABEL_Text, "",
TAG_END
),
CHILD_WeightedWidth, 100,
TAG_END),
CHILD_WeightedHeight, 0,
LAYOUT_AddChild,
NewObject
( LAYOUT_GetClass(), NULL,
LAYOUT_Orientation, LAYOUT_ORIENT_HORIZ,
LAYOUT_VertAlignment, LALIGN_CENTER,
LAYOUT_HorizAlignment, LALIGN_CENTER,
LAYOUT_BevelStyle, BVS_NONE,
LAYOUT_AddImage,
NewObject
( LABEL_GetClass(), NULL,
// label
LABEL_Text, "_View as:",
LABEL_Justification,LJ_RIGHT,
TAG_END),
CHILD_WeightedWidth, 0,
LAYOUT_AddChild, size_gadgets[GID_8_CH1] =
NewObject
( CHOOSER_GetClass(),NULL,
GA_ID, GID_8_CH1,
GA_RelVerify, TRUE,
CHOOSER_PopUp, TRUE,
CHOOSER_Labels, &ChooserList,
CHOOSER_Selected, size.view,
TAG_END
),
CHILD_WeightedWidth, 0,
LAYOUT_AddChild, size_gadgets[GID_8_CB2] =
NewObject
( CHECKBOX_GetClass(),NULL,
// checkbox
GA_ID, GID_8_CB2,
GA_RelVerify, TRUE,
GA_Text, "Include _slack?",
GA_Selected, (BOOL) size.slack,
TAG_END),
CHILD_WeightedWidth, 0,
LAYOUT_AddImage, NewObject
( LABEL_GetClass(), NULL,
LABEL_Text, "",
TAG_END
),
CHILD_WeightedWidth, 100,
TAG_END),
CHILD_WeightedHeight, 0,
LAYOUT_AddChild, size_gadgets[GID_8_CB3] =
NewObject
( CHECKBOX_GetClass(), NULL,
GA_ID, GID_8_CB3,
GA_RelVerify, TRUE,
GA_Text, "Fi_x protection bits?",
GA_Selected, (BOOL) size.fixprot,
TAG_END),
CHILD_WeightedHeight, 0,
LAYOUT_AddChild, size_gadgets[GID_8_FG1] =
NewObject
( FUELGAUGE_GetClass(), NULL,
GA_ID, GID_8_FG1,
GA_Text, "Ready.",
FUELGAUGE_Level, 0,
FUELGAUGE_Percent, FALSE,
FUELGAUGE_Justification,FGJ_CENTER,
TAG_END),
CHILD_WeightedHeight, 0,
LAYOUT_AddChild,
NewObject
( LAYOUT_GetClass(), NULL,
LAYOUT_Orientation, LAYOUT_ORIENT_HORIZ,
LAYOUT_VertAlignment, LALIGN_CENTER,
LAYOUT_HorizAlignment,LALIGN_CENTER,
LAYOUT_BevelStyle, BVS_NONE,
LAYOUT_AddChild, size_gadgets[GID_8_BU4] =
NewObject
( NULL, "button.gadget",
GA_ID, GID_8_BU4,
GA_RelVerify, TRUE,
GA_Text, "_Update",
TAG_END),
LAYOUT_AddChild, size_gadgets[GID_8_BU5] =
NewObject
( NULL, "button.gadget",
GA_ID, GID_8_BU5,
GA_RelVerify, TRUE,
GA_Text, "Stop",
GA_Disabled, TRUE,
TAG_END),
TAG_END),
CHILD_WeightedHeight, 0,
TAG_END)
)))
{ rq("Can't create ReAction objects!");
}
unlockscreen();
openwindow();
ActivateLayoutGadget(size_gadgets[GID_8_LY1], MainWindowPtr, NULL, (Object) size_gadgets[GID_8_ST1]);
loop();
closewindow();
size_exit();
}
AGLOBAL void updatesize(void)
{ ABOOL failed = FALSE;
struct FileInfoBlock* FIBPtr = NULL;
struct InfoData* InfoDataPtr;
struct ExAllControl* eac;
struct SpecialNode* NodePtr;
ghost();
SetGadgetAttrs
( size_gadgets[GID_8_FG1], MainWindowPtr, NULL,
FUELGAUGE_Min, 0,
FUELGAUGE_Max, 100,
FUELGAUGE_Level, 12,
GA_Text, "Initializing...",
TAG_END
);
killsizelist();
if ((List1.lh_Head)->ln_Succ) // the list is non-empty
{ FreeSpecialNodes(&List1);
}
if ((List2.lh_Head)->ln_Succ) // the list is non-empty
{ FreeSpecialNodes(&List2);
}
topnesting = 0;
// 1: Ghost relevant gadgets, for duration of the operation.
SetGadgetAttrs
( size_gadgets[GID_8_FG1], MainWindowPtr, NULL,
FUELGAUGE_Min, 0,
FUELGAUGE_Max, 100,
FUELGAUGE_Level, 33,
GA_Text, "Reading directories...",
TAG_END
); // we don't know how many files in advance...
// 2: Now get a Lock() on the path.
size.numdirs = size.numfiles = 0;
/* From RKRM I&A, p. 65: */
if
( !(DirHandle = (BPTR) Lock(size.path, ACCESS_READ))
|| !(FIBPtr = AllocDosObject(DOS_FIB, NULL))
|| !( Examine(DirHandle, FIBPtr))
|| (FIBPtr->fib_DirEntryType <= 0) // if not a directory
)
{ failed = TRUE;
}
strcpy(size.oldpath, size.path);
if (FIBPtr)
{ FreeDosObject(DOS_FIB, FIBPtr);
// FIBPtr = NULL;
}
if (failed)
{ DisplayBeep(ScreenPtr);
unghost();
strcpy(size.path, size.oldpath);
SetGadgetAttrs
( size_gadgets[GID_8_ST1], MainWindowPtr, NULL,
STRINGA_TextVal, size.path,
TAG_END
);
SetGadgetAttrs
( size_gadgets[GID_8_FG1], MainWindowPtr, NULL,
FUELGAUGE_Level, 0,
GA_Text, "Failed!",
TAG_END
);
return;
}
SetGadgetAttrs
( size_gadgets[GID_8_ST1], MainWindowPtr, NULL,
STRINGA_TextVal, size.path,
TAG_END
);
/* 3: Now we call Info() to ascertain the free bytes.
InfoDataPtr must be longword-aligned. */
if (!(InfoDataPtr = AllocVec(sizeof(struct InfoData), MEMF_CLEAR | MEMF_PUBLIC)))
{ rq("Out of memory!");
}
if (Info(DirHandle, InfoDataPtr))
{ size.blocksize = InfoDataPtr->id_BytesPerBlock;
size.free =
(InfoDataPtr->id_NumBlocks - InfoDataPtr->id_NumBlocksUsed) *
InfoDataPtr->id_BytesPerBlock;
size.capacity =
InfoDataPtr->id_NumBlocks *
InfoDataPtr->id_BytesPerBlock;
} else
{ rq("Can't get volume info!");
}
FreeVec(InfoDataPtr);
// InfoDataPtr = NULL;
comma(size.blocksize, commastring);
SetGadgetAttrs // "dirs"
( size_gadgets[GID_8_ST8], MainWindowPtr, NULL,
STRINGA_TextVal, commastring,
TAG_END
);
/* 4: Now we are ready to begin the main part of the operation. */
size.total = 0;
// This must be allocated with AllocDosObject()
if (!(eac = AllocDosObject(DOS_EXALLCONTROL, NULL)))
{ rq("Can't allocate DOS object!");
}
// examine path
AddSpecialNode(&List1, "", 0, 0, 0, 0, ST_USERDIR, 0);
key = 0;
for (NodePtr = List1.lh_Head; NodePtr->Node.ln_Succ; NodePtr = NodePtr->Node.ln_Succ)
{ if (NodePtr->type == ST_USERDIR)
{ examine
( NodePtr->pathname,
NodePtr->nesting,
NodePtr->key
);
} }
if (status == STATUS_BUSY)
{ busy();
}
if (status != STATUS_BUSY)
{ SetGadgetAttrs // "used in path"
( size_gadgets[GID_8_ST4], MainWindowPtr, NULL,
STRINGA_TextVal, "-",
TAG_END
);
SetGadgetAttrs // "free on volume"
( size_gadgets[GID_8_ST5], MainWindowPtr, NULL,
STRINGA_TextVal, "-",
TAG_END
);
SetGadgetAttrs // "volume capacity"
( size_gadgets[GID_8_ST3], MainWindowPtr, NULL,
STRINGA_TextVal, "-",
TAG_END
);
SetGadgetAttrs // "files"
( size_gadgets[GID_8_ST6], MainWindowPtr, NULL,
STRINGA_TextVal, "-",
TAG_END
);
SetGadgetAttrs // "directories"
( size_gadgets[GID_8_ST7], MainWindowPtr, NULL,
STRINGA_TextVal, "-",
TAG_END
);
SetGadgetAttrs // "block size"
( size_gadgets[GID_8_ST8], MainWindowPtr, NULL,
STRINGA_TextVal, "-",
TAG_END
);
killsizelist();
}
unghost();
SetGadgetAttrs
( size_gadgets[GID_8_FG1], MainWindowPtr, NULL,
FUELGAUGE_Min, 0,
FUELGAUGE_Max, 100,
FUELGAUGE_Level, 100,
GA_Text, "Done",
TAG_END
);
if (LogFileHandle)
{ Close(LogFileHandle);
LogFileHandle = NULL;
} }
AGLOBAL void size_loop(ULONG gid)
{ ULONG i, length;
STRPTR stringptr;
struct ListBrowserNode* NodePtr;
switch(gid)
{
case GID_8_BU1: // path ASL
pathasl();
break;
case GID_8_BU3:
asl("~(#?.info)");
SetGadgetAttrs // `Log to file:' (string)
( size_gadgets[GID_8_ST2], MainWindowPtr, NULL,
STRINGA_TextVal, size.logfile,
TAG_END);
break;
case GID_8_BU4: // update
updatesize();
break;
// GID_8_BU5 is stop
case GID_8_BU6:
root();
break;
case GID_8_BU7:
parent();
break;
case GID_8_ST1: // path string
if (!(GetAttr
( STRINGA_TextVal, size_gadgets[GID_8_ST1], (ULONG *) &stringptr
)))
{ rq("Unsupported inquiry!"); // should never happen
}
strcpy(size.path, stringptr);
updatesize();
break;
case GID_8_ST2: // output string
if (!(GetAttr
( STRINGA_TextVal, size_gadgets[GID_8_ST2], (ULONG *) &stringptr
)))
{ rq("Unsupported inquiry!"); // should never happen
}
strcpy(size.logfile, stringptr);
break;
case GID_8_CB1:
if (!(GetAttr
( GA_Selected, size_gadgets[GID_8_CB1], &size.log
)))
{ rq("Unsupported inquiry!"); // should never happen
}
SetGadgetAttrs // `Log to file:' (string)
( size_gadgets[GID_8_ST2], MainWindowPtr, NULL,
GA_Disabled, !size.log,
TAG_END
);
/* For some reason, we need to explicitly refresh the string gadget
visuals here */
RefreshGadgets((struct Gadget *) size_gadgets[GID_8_ST2], MainWindowPtr, NULL);
SetGadgetAttrs // `Log to file:' (ASL button)
( size_gadgets[GID_8_BU3], MainWindowPtr, NULL,
GA_Disabled, !size.log,
TAG_END
);
if (size.log)
{ ActivateLayoutGadget(size_gadgets[GID_8_LY1], MainWindowPtr, NULL, (Object) size_gadgets[GID_8_ST2]);
}
break;
case GID_8_CB2:
if (!(GetAttr
( GA_Selected, size_gadgets[GID_8_CB2], (ULONG *) &size.slack
)))
{ rq("Unsupported inquiry!"); // should never happen
}
break;
case GID_8_CB3:
if (!(GetAttr
( GA_Selected, size_gadgets[GID_8_CB3], (ULONG *) &size.fixprot
)))
{ rq("Unsupported inquiry!"); // should never happen
}
break;
case GID_8_CB4:
if (!(GetAttr
( GA_Selected, size_gadgets[GID_8_CB4], (ULONG *) &showall
)))
{ rq("Unsupported inquiry!"); // should never happen
}
print_list(TRUE);
break;
case GID_8_CB5:
if (!(GetAttr
( GA_Selected, size_gadgets[GID_8_CB5], (ULONG *) &showfiles
)))
{ rq("Unsupported inquiry!"); // should never happen
}
print_list(TRUE);
break;
case GID_8_CH1:
if (!(GetAttr
( CHOOSER_Selected, size_gadgets[GID_8_CH1], (ULONG *) &size.view
)))
{ rq("Unsupported inquiry!"); // should never happen
}
print_list(TRUE);
break;
case GID_8_LB2:
// We get a message even if the user clicked on an empty part of
// the gadget.
if (!(GetAttr
( LISTBROWSER_SelectedNode, size_gadgets[GID_8_LB2], (ULONG *) &NodePtr
)))
{ rq("Unsupported inquiry!"); // should never happen
}
if (NodePtr)
{ GetListBrowserNodeAttrs((struct Node *) NodePtr, LBNA_Column, 0, LBNCA_Text, &stringptr, TAG_DONE);
length = strlen(stringptr);
for (i = 0; i <= length; i++)
{ if (*(stringptr + i) == '*')
{ if (!(AddPart(size.path, stringptr + i + 1, PATHNAMEFIELD)))
{ rq("Can't add filename to pathname!");
}
updatesize();
break;
} } }
break;
default:
break;
} }
AGLOBAL void size_exit(void)
{ if (DirHandle)
{ UnLock(DirHandle);
DirHandle = NULL;
}
if (LogFileHandle)
{ Close(LogFileHandle);
LogFileHandle = NULL;
}
if ((List1.lh_Head)->ln_Succ) // the list is non-empty
{ FreeSpecialNodes(&List1);
}
if ((List2.lh_Head)->ln_Succ) // the list is non-empty
{ FreeSpecialNodes(&List2);
}
// Only call this if the list gadget is detached or not present.
// (ie. after closewindow()).
if ((SizeList.lh_Head)->ln_Succ) // if the list is non-empty
{ clearreactionlist(&SizeList);
} }
AGLOBAL void size_die(void)
{ if ((EmptySizeList.lh_Head)->ln_Succ) // if the list is non-empty
{ clearreactionlist(&EmptySizeList);
}
IOBuffer[0] = (UBYTE) size.log;
IOBuffer[6] = (UBYTE) showfiles;
IOBuffer[15] = (UBYTE) showall;
IOBuffer[21] = (UBYTE) size.slack;
IOBuffer[22] = (UBYTE) size.view;
IOBuffer[24] = (UBYTE) size.fixprot;
}
AGLOBAL void size_config(void)
{ size.log = (ULONG) IOBuffer[0];
showfiles = (ULONG) IOBuffer[6];
showall = (ULONG) IOBuffer[15];
size.slack = (ULONG) IOBuffer[21];
size.view = (ULONG) IOBuffer[22];
size.fixprot = (ULONG) IOBuffer[24];
}
MODULE void parent(void)
{ BPTR DirHandle,
ParentHandle;
if (!(DirHandle = (BPTR) Lock(size.path, ACCESS_READ)))
rq("Can't lock directory!");
if (!(ParentHandle = ParentDir(DirHandle)))
{ /* It returned a NULL lock; ie. a lock on SYS:
That is not what we want. */
ParentHandle = DirHandle;
}
if (!NameFromLock(ParentHandle, size.path, PATHNAMEFIELD))
rq("Can't get name from lock!");
UnLock(DirHandle);
// DirHandle = NULL;
updatesize();
}
MODULE void root(void)
{ BPTR DirHandle,
ParentHandle;
ABOOL rootdone = FALSE;
if (!(DirHandle = (BPTR) Lock(size.path, ACCESS_READ)))
rq("Can't lock directory!");
do
{ if (!(ParentHandle = ParentDir(DirHandle)))
{ /* It returned a NULL lock; ie. a lock on SYS:
That is not what we want. */
ParentHandle = DirHandle;
rootdone = TRUE;
} else DirHandle = ParentHandle;
} while (!rootdone);
if (!NameFromLock(ParentHandle, size.path, PATHNAMEFIELD))
rq("Can't get name from lock!");
UnLock(DirHandle);
// DirHandle = NULL;
updatesize();
}
MODULE void pathasl(void)
{ strcpy(asldir, size.path);
if (dirasl()) // path for ASL must be valid?
{ strcpy(size.path, aslresult);
SetGadgetAttrs
( size_gadgets[GID_8_ST1], MainWindowPtr, NULL,
STRINGA_TextVal, size.path,
TAG_END
);
updatesize();
} }
MODULE void writeline(void)
{ /* The file is opened just before the first call to writeline()
(when the date, time, etc. is written). Then we keep the file open
and do our scan. Then we write out the results a line at a time,
then the free and total bytes. */
if (FPuts(LogFileHandle, logstring))
{ Close(LogFileHandle);
LogFileHandle = NULL;
rq("Can't append to file!");
} }
MODULE void killsizelist(void)
{ SetGadgetAttrs
( size_gadgets[GID_8_LB2], MainWindowPtr, NULL,
LISTBROWSER_Labels, &EmptySizeList,
TAG_END
);
if ((SizeList.lh_Head)->ln_Succ) // if the list is non-empty
{ clearreactionlist(&SizeList);
} }
AGLOBAL ULONG Hook8Func(struct Hook *h, VOID *o, VOID *msg)
{ /* "When the hook is called, the data argument points to the
window object and message argument to the IntuiMessage." */
UWORD code, qual;
ULONG scroll = 0; // to avoid spurious compiler warnings
geta4(); // wait till here before doing anything
code = ((struct IntuiMessage *) msg)->Code;
qual = ((struct IntuiMessage *) msg)->Qualifier;
switch(code)
{
case SCAN_HELP:
if (status == STATUS_READY)
{ helpabout();
}
break;
case SCAN_ESCAPE:
if (status == STATUS_READY)
{ if ((qual & IEQUALIFIER_LSHIFT) || (qual & IEQUALIFIER_RSHIFT))
{ cleanexit(EXIT_SUCCESS);
} else page = 0;
} else
{ // assert(status == STATUS_BUSY);
status = STATUS_STOPPING;
}
break;
case SCAN_P:
ActivateLayoutGadget(size_gadgets[GID_8_LY1], MainWindowPtr, NULL, (Object) size_gadgets[GID_8_ST1]);
break;
case SCAN_V:
if (status == STATUS_READY)
{ if (!(qual & IEQUALIFIER_LSHIFT) && !(qual & IEQUALIFIER_RSHIFT))
{ if (size.view < UNITOPTIONS)
size.view++;
else size.view = 0;
} else
{ if (size.view > 0)
size.view--;
else size.view = UNITOPTIONS;
}
SetGadgetAttrs
( size_gadgets[GID_8_CH1], MainWindowPtr, NULL,
CHOOSER_Selected, size.view,
TAG_END
);
}
break;
case SCAN_PERIOD:
pathasl();
break;
case SCAN_UP:
if (qual & IEQUALIFIER_CONTROL)
{ scroll = LBP_TOP;
} elif (qual & IEQUALIFIER_LSHIFT || qual & IEQUALIFIER_RSHIFT)
{ scroll = LBP_PAGEUP;
} else scroll = LBP_LINEUP;
break;
case SCAN_DOWN:
if (qual & IEQUALIFIER_CONTROL)
{ scroll = LBP_BOTTOM;
} elif (qual & IEQUALIFIER_LSHIFT || qual & IEQUALIFIER_RSHIFT)
{ scroll = LBP_PAGEDOWN;
} else scroll = LBP_LINEDOWN;
break;
default:
break;
}
if (code == SCAN_UP || code == SCAN_DOWN)
{ SetGadgetAttrs
( size_gadgets[GID_8_LB2], // pointer to gadget
MainWindowPtr, // pointer to window (not window object!)
NULL, // pointer to requester
LISTBROWSER_Position, scroll, // tags
TAG_DONE // done
);
}
return(1);
}
MODULE void ghost(void)
{ status = STATUS_BUSY;
SetGadgetAttrs // "update"
( size_gadgets[GID_8_BU4], MainWindowPtr, NULL,
GA_Disabled, TRUE,
TAG_END
);
SetGadgetAttrs // "stop"
( size_gadgets[GID_8_BU5], MainWindowPtr, NULL,
GA_Disabled, FALSE,
TAG_END
);
}
MODULE void unghost(void)
{ status = STATUS_READY;
SetGadgetAttrs // "update"
( size_gadgets[GID_8_BU4], MainWindowPtr, NULL,
GA_Disabled, FALSE,
TAG_END
);
SetGadgetAttrs // "stop"
( size_gadgets[GID_8_BU5], MainWindowPtr, NULL,
GA_Disabled, TRUE,
TAG_END
);
}
MODULE void scale(ULONG bytes)
{ if (size.view == 0) // bytes
{ comma(bytes, commastring);
} elif (size.view == 1) // kilobytes
{ comma(bytes / 1024, commastring);
} elif (size.view == 2) // megabytes
{ comma(bytes / 1048576, commastring);
} else
{ // assert(size.view == 3); // blocks
// assert(size.blocksize); // to avoid division by zero
comma(bytes / size.blocksize, commastring);
if (bytes % size.blocksize)
{ comma((bytes / size.blocksize) + 1, commastring);
} else // exactly on a block boundary
{ comma(bytes / size.blocksize, commastring);
} } }
/*
MODULE void __inline progressbar(ULONG level)
{ if (!(level % increment))
{ SetGadgetAttrs
( size_gadgets[GID_8_FG1], MainWindowPtr, NULL,
FUELGAUGE_Level, level,
TAG_END
);
} }
*/
MODULE void examine(STRPTR thename, ULONG nesting, ULONG parentdir)
{ BOOL more; // BOOL, not ABOOL
BPTR DirHandle; // = NULL;
struct ExAllControl* eac; // = NULL;
struct ExAllData* ead;
ULONG baselength = strlen(size.path),
breakval,
thesize;
TEXT activefile[PATHNAMEFIELD + 1],
lockstring[PATHNAMEFIELD + 1];
LONG ed,
prot;
breakval = ra_checkbreak();
if (breakval == 2)
{ cleanexit(EXIT_SUCCESS);
} elif (breakval == 1)
{ status = STATUS_STOPPING;
SetGadgetAttrs
( size_gadgets[GID_8_FG1], MainWindowPtr, NULL,
GA_Text, "Stopping...",
TAG_END
);
}
if (status == STATUS_STOPPING)
{ return;
}
strcpy(lockstring, size.path);
strcat(lockstring, thename);
if (!(DirHandle = (BPTR) Lock(lockstring, ACCESS_READ)))
{ // Printf("Can't lock %s!\n", lockstring);
rq("Can't lock directory!");
}
if (!(eac = AllocDosObject(DOS_EXALLCONTROL, NULL)))
{ UnLock(DirHandle);
DirHandle = NULL;
rq("Can't allocate DOS object!");
}
if (size.fixprot)
{ ed = ED_PROTECTION; // we want name, type, size and protection
} else
{ ed = ED_SIZE; // we want name, type and size
}
eac->eac_LastKey = 0;
do
{ more = ExAll(DirHandle, (struct ExAllData *) EADataPtr, 4096, ed, eac);
if (!more && IoErr() != ERROR_NO_MORE_ENTRIES)
{ FreeDosObject(DOS_EXALLCONTROL, eac);
eac = NULL;
UnLock(DirHandle);
DirHandle = NULL;
rq("Can't examine path!"); /* ExAll() failed abnormally */
}
if (eac->eac_Entries == 0)
{ ; /* ExAll() failed normally with no entries */
continue; /* more is USUALLY zero */
}
ead = (struct ExAllData *) EADataPtr;
do
{ /* use ead here */
strcpy(activefile, lockstring);
if (!AddPart(activefile, ead->ed_Name, PATHNAMEFIELD))
{ FreeDosObject(DOS_EXALLCONTROL, eac);
eac = NULL;
UnLock(DirHandle);
DirHandle = NULL;
rq("Can't add filename/dirname to path!");
}
if (ead->ed_Type == ST_USERDIR)
{ size.numdirs++;
if (!(size.numdirs % GRANULARITY_DIRS))
{ comma(size.numdirs, commastring);
SetGadgetAttrs
( size_gadgets[GID_8_ST7], MainWindowPtr, NULL,
STRINGA_TextVal, commastring,
TAG_END
);
}
AddSpecialNode
( &List1, // list
&activefile[baselength + 1], // filename
nesting + 1, // nesting
0, // size
parentdir, // parentdir
++key, // key
ST_USERDIR, // type
0 // protection bits
);
if (topnesting < nesting + 1)
{ topnesting = nesting + 1;
} }
elif (ead->ed_Type == ST_FILE)
{ size.numfiles++;
if (!(size.numfiles % GRANULARITY_FILES))
{ comma(size.numfiles, commastring);
SetGadgetAttrs
( size_gadgets[GID_8_ST6], MainWindowPtr, NULL,
STRINGA_TextVal, commastring,
TAG_END
);
}
if (size.slack)
{ if (ead->ed_Size % size.blocksize == 0)
{ thesize = ead->ed_Size;
} else
{ thesize = ((ead->ed_Size / size.blocksize) + 1) * size.blocksize;
} }
else
{ thesize = ead->ed_Size;
}
size.total += thesize;
if (size.fixprot)
{ prot = ead->ed_Prot;
} else
{ prot = 0;
}
AddSpecialNode
( &List1, // list
&activefile[baselength + 1], // filename
nesting + 1, // nesting
thesize, // size
parentdir, // parentdir
++key, // key
ST_FILE, // type
prot // protection bits
);
if (topnesting < nesting + 1)
{ topnesting = nesting + 1;
} }
/* get next ead */
ead = ead->ed_Next;
} while(ead);
} while(more);
FreeDosObject(DOS_EXALLCONTROL, eac);
// eac = NULL;
UnLock(DirHandle);
// DirHandle = NULL;
}
MODULE void AddSpecialNode(struct List* ListPtr, STRPTR pathname, ULONG nesting, ULONG size, ULONG parentdir, ULONG key, LONG type, LONG prot)
{ struct SpecialNode* NodePtr;
ULONG needed;
needed = sizeof(struct SpecialNode) + strlen(pathname);
if (!(NodePtr = AllocVec(needed, MEMF_CLEAR | MEMF_PUBLIC)))
rq("Out of memory!");
strcpy(NodePtr->pathname, pathname);
NodePtr->nesting = nesting;
NodePtr->size = size;
NodePtr->parentdir = parentdir;
NodePtr->key = key;
NodePtr->type = type;
NodePtr->prot = prot;
NodePtr->Node.ln_Name = NULL;
NodePtr->Node.ln_Type = NT_USER;
NodePtr->Node.ln_Pri = 0;
AddTail((struct List *) ListPtr, (struct Node *) NodePtr);
}
MODULE void FreeSpecialNodes(struct List* ListPtr)
{ /* RKM Libraries, p. 496:
"Free the entire list, including the header. The header is not
updated as the list is freed. This function demonstrates how to
avoid referencing freed memory when deallocating nodes." */
struct SpecialNode *WorkNodePtr, *NextNodePtr;
WorkNodePtr = (struct SpecialNode *) (ListPtr->lh_Head); /* first node */
while (NextNodePtr = (struct SpecialNode *) (WorkNodePtr->Node.ln_Succ))
{ FreeVec(WorkNodePtr);
WorkNodePtr = NextNodePtr;
}
NewList(ListPtr);
}
MODULE void print_node(ULONG passedkey)
{ struct SpecialNode *NodePtr,
*ChildNodePtr;
for (NodePtr = List2.lh_Head; NodePtr->Node.ln_Succ; NodePtr = NodePtr->Node.ln_Succ)
{ if (NodePtr->key == passedkey)
{ break;
} }
if (NodePtr->key != 0)
{ print_entry(NodePtr);
}
// print child dirs
for (ChildNodePtr = List2.lh_Head; ChildNodePtr->Node.ln_Succ; ChildNodePtr = ChildNodePtr->Node.ln_Succ)
{ if (ChildNodePtr->key != 0)
{ if (ChildNodePtr->parentdir == passedkey && (showall || ChildNodePtr->nesting <= 1))
{ if (ChildNodePtr->type == ST_USERDIR)
{ print_node(ChildNodePtr->key);
} elif (showfiles)
{ print_entry(ChildNodePtr);
} } } } }
MODULE void print_entry(struct SpecialNode* NodePtr)
{ ULONG i, length,
where = 0; // to avoid spurious compiler warnings
struct ListBrowserNode* ListBrowserNodePtr;
logstring[0] = 0;
if (NodePtr->nesting >= 2)
{ for (i = 2; i <= NodePtr->nesting; i++)
{ strcat(logstring, " ");
} }
if (NodePtr->type == ST_USERDIR)
{ strcat(logstring, "*");
} else
{ strcat(logstring, "+");
}
strcat(logstring, FilePart(NodePtr->pathname));
scale(NodePtr->size);
for (i = 0; i <= 13; i++)
{ if (commastring[i] != ' ')
{ where = i; // where is index of first non-space character
break;
} }
if (!(ListBrowserNodePtr = AllocListBrowserNode
( 2, // columns,
LBNA_Column, 0,
LBNCA_CopyText, TRUE,
LBNCA_Text, logstring,
LBNA_Column, 1,
LBNCA_CopyText, TRUE,
LBNCA_Text, &commastring[where],
LBNCA_Justification, LCJ_RIGHT,
TAG_END
)))
{ rq("Can't create ReAction listbrowser.gadget node(s)!");
}
AddTail(&SizeList, (struct Node *) ListBrowserNodePtr); // AddTail() has no return code
if (size.log)
{ length = strlen(logstring);
if (length < 50)
{ for (i = 1; i <= 41 - length; i++)
{ strcat(logstring, " ");
} }
strcat(logstring, commastring);
strcat(logstring, "\n");
writeline();
} }
MODULE void print_list(ABOOL close)
{ getdate();
if (size.log)
{ strcpy(logstring, "Path: \"");
strcat(logstring, size.path);
strcat(logstring, "\" at ");
strcat(logstring, timestring);
strcat(logstring, " on ");
strcat(logstring, weekdaystring);
strcat(logstring, " ");
strcat(logstring, datestring);
strcat(logstring, ":\n");
if (!(LogFileHandle = (BPTR) Open(size.logfile, MODE_READWRITE)))
rq("Can't open file for appending!");
Seek(LogFileHandle, 0, OFFSET_END);
writeline();
}
killsizelist();
print_node(0);
SetGadgetAttrs
( size_gadgets[GID_8_LB2], MainWindowPtr, NULL,
LISTBROWSER_Labels, &SizeList,
TAG_END
);
scale(size.total);
SetGadgetAttrs // "used in path"
( size_gadgets[GID_8_ST4], MainWindowPtr, NULL,
STRINGA_TextVal, commastring,
TAG_END
);
scale(size.free);
SetGadgetAttrs // "free on volume"
( size_gadgets[GID_8_ST5], MainWindowPtr, NULL,
STRINGA_TextVal, commastring,
TAG_END
);
scale(size.capacity);
SetGadgetAttrs // "volume capacity"
( size_gadgets[GID_8_ST3], MainWindowPtr, NULL,
STRINGA_TextVal, commastring,
TAG_END
);
comma(size.numfiles, commastring);
SetGadgetAttrs // "files"
( size_gadgets[GID_8_ST6], MainWindowPtr, NULL,
STRINGA_TextVal, commastring,
TAG_END
);
comma(size.numdirs, commastring);
SetGadgetAttrs // "dirs"
( size_gadgets[GID_8_ST7], MainWindowPtr, NULL,
STRINGA_TextVal, commastring,
TAG_END
);
if (size.log)
{ strcpy(logstring, "\nUsed in path: ");
scale(size.total);
strcat(logstring, commastring);
strcat(logstring, "\nFree on volume: "); // these must be adjusted according to TRUNCATE
scale(size.free);
strcat(logstring, commastring);
strcat(logstring, "\nVolume capacity: "); // these must be adjusted according to TRUNCATE
scale(size.capacity);
strcat(logstring, commastring);
strcat(logstring, "\nFiles: "); // these must be adjusted according to TRUNCATE
comma(size.numfiles, commastring);
strcat(logstring, commastring);
strcat(logstring, "\nDirectories: "); // these must be adjusted according to TRUNCATE
comma(size.numdirs, commastring);
strcat(logstring, commastring);
strcat(logstring, "\nBlock size: "); // these must be adjusted according to TRUNCATE
comma(size.blocksize, commastring);
strcat(logstring, commastring);
strcat(logstring, "\n\n");
writeline();
}
if (close && LogFileHandle)
{ Close(LogFileHandle);
LogFileHandle = NULL;
} }
MODULE void busy(void)
{ ULONG breakval, largestsize,
largestkey = 0; // to avoid spurious compiler warnings
SLONG nesting;
struct SpecialNode *NodePtr,
*ParentNodePtr;
TEXT activefile[PATHNAMEFIELD + 1];
if (size.fixprot)
{ SetGadgetAttrs
( size_gadgets[GID_8_FG1], MainWindowPtr, NULL,
FUELGAUGE_Min, 0,
FUELGAUGE_Max, 100,
FUELGAUGE_Level, 45,
GA_Text, "Fixing protection bits...",
TAG_END
);
if ((List1.lh_Head)->ln_Succ) // the list is non-empty
{ // walk the files list
for (NodePtr = List1.lh_Head; NodePtr->Node.ln_Succ; NodePtr = NodePtr->Node.ln_Succ)
{ if (NodePtr->type == ST_FILE)
{ /* The rwed bits are SET to DENY access,
CLEARED to PERMIT access.
128 064 032 016 008 004 002 001
-H- -S- -P- -A- -R- -W- -E- -D- */
if
( (NodePtr->prot & FIBF_READ)
|| (NodePtr->prot & FIBF_WRITE)
|| (NodePtr->prot & FIBF_EXECUTE)
|| (NodePtr->prot & FIBF_DELETE)
)
{ NodePtr->prot &= ~FIBF_READ;
NodePtr->prot &= ~FIBF_WRITE;
NodePtr->prot &= ~FIBF_EXECUTE;
NodePtr->prot &= ~FIBF_DELETE;
strcpy(activefile, size.path);
if (!AddPart(activefile, NodePtr->pathname, PATHNAMEFIELD))
{ rq("Can't add filename to pathname!");
}
if (!(SetProtection(activefile, NodePtr->prot)))
{ rq("Can't fix protection bits!");
} } } } } }
SetGadgetAttrs
( size_gadgets[GID_8_FG1], MainWindowPtr, NULL,
FUELGAUGE_Min, 0,
FUELGAUGE_Max, 100,
FUELGAUGE_Level, 50,
GA_Text, "Calculating sizes...",
TAG_END
);
// calculate sizes
for (nesting = topnesting; nesting >= 0; nesting--)
{ breakval = ra_checkbreak();
if (breakval == 2)
{ cleanexit(EXIT_SUCCESS);
} elif (breakval == 1)
{ status = STATUS_STOPPING;
SetGadgetAttrs
( size_gadgets[GID_8_FG1], MainWindowPtr, NULL,
GA_Text, "Stopping...",
TAG_END
);
}
if (status == STATUS_STOPPING)
{ return;
}
// walk the files list
for (NodePtr = List1.lh_Head; NodePtr->Node.ln_Succ; NodePtr = NodePtr->Node.ln_Succ)
{ if (NodePtr->nesting == nesting)
{ for (ParentNodePtr = List1.lh_Head; ParentNodePtr->Node.ln_Succ; ParentNodePtr = ParentNodePtr->Node.ln_Succ)
{ if (ParentNodePtr->type == ST_USERDIR && ParentNodePtr->key == NodePtr->parentdir)
{ break;
} }
ParentNodePtr->size += NodePtr->size;
} } }
SetGadgetAttrs
( size_gadgets[GID_8_FG1], MainWindowPtr, NULL,
FUELGAUGE_Min, 0,
FUELGAUGE_Max, 100,
FUELGAUGE_Level, 66,
GA_Text, "Sorting results...",
TAG_END
);
// sort by size
while ((List1.lh_Head)->ln_Succ) // while the list is non-empty
{ breakval = ra_checkbreak();
if (breakval == 2)
{ cleanexit(EXIT_SUCCESS);
} elif (breakval == 1)
{ status = STATUS_STOPPING;
SetGadgetAttrs
( size_gadgets[GID_8_FG1], MainWindowPtr, NULL,
GA_Text, "Stopping...",
TAG_END
);
}
if (status == STATUS_STOPPING)
{ return;
}
// walk through the list to determine the largest entry
largestsize = 0;
for (NodePtr = List1.lh_Head; NodePtr->Node.ln_Succ; NodePtr = NodePtr->Node.ln_Succ)
{ if (NodePtr->size >= largestsize)
{ largestsize = NodePtr->size;
largestkey = NodePtr->key;
} }
// walk through the list and remove the largest entry
for (NodePtr = List1.lh_Head; NodePtr->Node.ln_Succ; NodePtr = NodePtr->Node.ln_Succ)
{ if (NodePtr->key == largestkey)
{ Remove((struct Node *) NodePtr);
AddTail(&List2, (struct Node *) NodePtr);
break;
} } }
SetGadgetAttrs
( size_gadgets[GID_8_FG1], MainWindowPtr, NULL,
FUELGAUGE_Min, 0,
FUELGAUGE_Max, 100,
FUELGAUGE_Level, 75,
GA_Text, "Generating list...",
TAG_END
);
SetGadgetAttrs // "stop"
( size_gadgets[GID_8_BU5], MainWindowPtr, NULL,
GA_Disabled, TRUE,
TAG_END
);
print_list(FALSE);
}